<template>
	<view class="datetime-picker-container">
		<!-- 显示选中的日期时间 -->
		<view class="selected-value" @click="open">
			<view :style="formattedValue ? '' : 'color: #999999'"> {{ formattedValue || '请选择年月日时分' }}</view>
			<view>
				<uv-icon name="arrow-right"></uv-icon>
			</view>
		</view>

		<!-- 日期时间选择器 - 最小日期改为当前时间 -->
		<uv-datetime-picker 
			ref="datetimePicker" 
			v-model="innerValue" 
			mode="datetime" 
			@confirm="handleConfirm"
			@cancel="handleCancel" 
			title="请选择年月日时分" 
			:min-date="minDate" 
		/>
	</view>
</template>

<script setup>
	import { ref, watch, computed } from 'vue';

	// 接收父组件传入的参数（新增一个控制是否限制为“当前时间后”的属性）
	const props = defineProps({
		modelValue: {
			type: Number,
			default: null
		},
		format: {
			type: String,
			default: 'YYYY-MM-DD HH:mm'
		},
		// 原属性保留，新增一个更精确的控制
		restrictToTodayAndFuture: {
			type: Boolean,
			default: true
		},
		// 新增：是否限制为“当前时间之后”（精确到分秒）
		restrictToCurrentTimeLater: {
			type: Boolean,
			default: false
		}
	});

	const emit = defineEmits(['update:modelValue', 'confirm', 'cancel']);

	// 关键修改：最小时间计算（根据新属性切换逻辑）
	const minDate = computed(() => {
		if (!props.restrictToTodayAndFuture) return null;
		
		const now = new Date();
		// 如果需要限制“当前时间之后”，则用实时时间；否则用当天0点
		if (props.restrictToCurrentTimeLater) {
			return now.getTime(); // 实时时间戳（如当前16:18:30的时间戳）
		} else {
			now.setHours(0, 0, 0, 0);
			return now.getTime();
		}
	});

	// 内部值
	const innerValue = ref(null);
	const datetimePicker = ref(null);
	const formattedValue = ref('');
	const isOneLoad = ref(true);

	// 初始化值（调整默认值为当前时间+1分钟，避免选到此刻之前）
	watch(
		() => props.modelValue,
		(newVal) => {
			// 验证新值是否有效且不早于最小时间
			if (isValidTimestamp(newVal) && newVal >= minDate.value) {
				innerValue.value = newVal;
			} else {
				// 无效时默认设为“当前时间+1分钟”
				const defaultTime = new Date();
				defaultTime.setMinutes(defaultTime.getMinutes() + 1);
				innerValue.value = Math.max(defaultTime.getTime(), minDate.value);
			}
		},
		{ immediate: true }
	);

	// 验证时间戳是否有效（不变）
	const isValidTimestamp = (timestamp) => {
		return typeof timestamp === 'number' && !isNaN(timestamp) &&
			new Date(timestamp).toString() !== 'Invalid Date';
	};

	// 格式化日期时间（不变）
	const formatDateTime = (timestamp) => {
		if (!isValidTimestamp(timestamp)) {
			return '';
		}

		const date = new Date(timestamp);
		if (date.toString() === 'Invalid Date') {
			return '';
		}

		const year = date.getFullYear();
		const month = String(date.getMonth() + 1).padStart(2, '0');
		const day = String(date.getDate()).padStart(2, '0');
		const hours = String(date.getHours()).padStart(2, '0');
		const minutes = String(date.getMinutes()).padStart(2, '0');

		return props.format
			.replace('YYYY', year)
			.replace('MM', month)
			.replace('DD', day)
			.replace('HH', hours)
			.replace('mm', minutes);
	};

	// 更新格式化显示值（不变）
	watch(
		() => innerValue.value,
		(newVal) => {
			if (isOneLoad.value) {
				isOneLoad.value = false;
				formattedValue.value = formatDateTime(newVal);
				return;
			}
			formattedValue.value = formatDateTime(newVal);
		},
		{ immediate: true }
	);

	// 打开选择器（新增：打开时强制刷新最小时间，避免缓存）
	const open = () => {
		// 每次打开都重新计算最小时间（确保是最新的当前时间）
		minDate.value; 
		datetimePicker.value?.open();
	};

	// 处理确认事件（加强校验，确保不早于当前时间）
	const handleConfirm = (value) => {
		const timestamp = value.value;
		const numericValue = Number(timestamp);
		
		if (isValidTimestamp(numericValue)) {
			// 强制取当前时间和选择时间的最大值（防止选择器偶发漏洞）
			const finalValue = props.restrictToCurrentTimeLater 
				? Math.max(numericValue, new Date().getTime()) 
				: numericValue;
				
			innerValue.value = finalValue;
			formattedValue.value = formatDateTime(finalValue);
			emit('update:modelValue', finalValue);
			emit('confirm', finalValue, formattedValue.value);
		}
	};

	// 处理取消事件（不变）
	const handleCancel = () => {
		emit('cancel');
	};

	// 暴露open方法（不变）
	defineExpose({
		open
	});
</script>

<style scoped>
	/* 样式不变 */
	.datetime-picker-container {
		width: 100%;
	}

	.selected-value {
		width: 100%;
		padding: 10px 2px;
		border-bottom: 1px solid #e5e7eb;
		box-sizing: border-box;
		font-size: 16px;
		color: #333;
		background-color: #fff;
		cursor: pointer;
		display: flex;
		justify-content: space-between;
		align-items: center;
	}

	.selected-value view:first-child:empty::before {
		content: '请选择日期时间';
		color: #9ca3af;
	}
</style>